﻿// Study1018.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 第十章 STL库和泛型设计

#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>
using namespace std;

class evenByTwo
{
public:
    evenByTwo() :x(0){}
    int operator()() { return x += 2; }

private:
    int x;
};

int main()
{
    int iarray1[] = { 0,1,2,3,4,4,5,5,6,6,6,6,6,7,8 };
    int iarray2[] = { 0,1,2,3,4,5,6,7,8 };
    vector<int> vec1(iarray1, iarray1 + sizeof(iarray1) / sizeof(int));
    vector<int> vec2(iarray2, iarray2 + sizeof(iarray2) / sizeof(int));
    vector<int> vec3(2);
    ostream_iterator<int> output(cout, " ");

    //迭代器遍历vec3区间，每一个元素填上-1
    fill(vec3.begin(), vec3.end(), -1);
    copy(vec3.begin(), vec3.end(), output);
    cout << endl;
    //迭代器遍历vec3区间，对每一个元素进行evenByTwo操作
    generate(vec3.begin(), vec3.end(), evenByTwo());
    copy(vec3.begin(), vec3.end(), output);
    cout << endl;
    //将删除元素6后的vec2序列置于另一个容器vec4中
    vector<int> vec4;
    remove_copy(vec2.begin(), vec2.end(), back_inserter(vec4), 6);
    copy(vec4.begin(), vec4.end(), output);
    cout << endl;
    //删除小于6的元素
    vec2.erase(remove_if(vec2.begin(), vec2.end(), bind2nd(less<int>(), 6)), vec2.end());
    copy(vec2.begin(), vec2.end(), output);
    cout << endl;
    //将所有的元素值6改为元素值3
    replace(vec2.begin(), vec2.end(), 6, 3);
    copy(vec2.begin(), vec2.end(), output);
    cout << endl;
    //逆向重排每一个元素
    reverse(vec2.begin(), vec2.end());
    copy(vec2.begin(), vec2.end(), output);
    cout << endl;

    return 0;
}


